#!/bin/bash

# 强化版Linux中文字体安装和诊断脚本
# 解决PDF转换中文乱码问题

set -e

echo "========================================"
echo "Linux中文字体安装和诊断工具"
echo "========================================"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

log_info() {
    echo -e "${BLUE}[信息]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[成功]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[警告]${NC} $1"
}

log_error() {
    echo -e "${RED}[错误]${NC} $1"
}

# 检测系统信息
detect_system() {
    log_info "检测系统信息..."

    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS_NAME=$NAME
        OS_VERSION=$VERSION_ID
    elif type lsb_release >/dev/null 2>&1; then
        OS_NAME=$(lsb_release -si)
        OS_VERSION=$(lsb_release -sr)
    else
        OS_NAME=$(uname -s)
        OS_VERSION=$(uname -r)
    fi

    log_info "操作系统: $OS_NAME $OS_VERSION"
    log_info "内核版本: $(uname -r)"
    log_info "架构: $(uname -m)"
}

# 检查现有字体
check_existing_fonts() {
    log_info "检查现有字体安装情况..."

    if ! command -v fc-list &> /dev/null; then
        log_warning "fontconfig 未安装，正在安装..."
        install_fontconfig
    fi

    # 检查中文字体
    log_info "检查已安装的中文字体:"
    CHINESE_FONTS=$(fc-list :lang=zh 2>/dev/null | wc -l)
    log_info "找到 $CHINESE_FONTS 个中文字体"

    if [ $CHINESE_FONTS -gt 0 ]; then
        log_info "前10个中文字体:"
        fc-list :lang=zh | head -10 | while read line; do
            font_name=$(echo "$line" | cut -d: -f2 | cut -d, -f1 | xargs)
            echo "  - $font_name"
        done
    else
        log_warning "没有找到中文字体"
    fi

    # 检查常用字体是否存在
    log_info "检查关键字体可用性:"
    check_fonts=(
        "Noto Sans CJK SC"
        "Source Han Sans CN"
        "WenQuanYi Micro Hei"
        "WenQuanYi Zen Hei"
        "Droid Sans Fallback"
        "DejaVu Sans"
        "Liberation Sans"
    )

    for font in "${check_fonts[@]}"; do
        if fc-list | grep -qi "$font"; then
            log_success "✓ $font"
        else
            log_warning "✗ $font (未安装)"
        fi
    done
}

# 安装fontconfig
install_fontconfig() {
    if [[ "$OS_NAME" == *"Ubuntu"* ]] || [[ "$OS_NAME" == *"Debian"* ]]; then
        sudo apt update && sudo apt install -y fontconfig
    elif [[ "$OS_NAME" == *"CentOS"* ]] || [[ "$OS_NAME" == *"Red Hat"* ]] || [[ "$OS_NAME" == *"Rocky"* ]]; then
        if command -v dnf &> /dev/null; then
            sudo dnf install -y fontconfig
        else
            sudo yum install -y fontconfig
        fi
    fi
}

# 安装系统字体包
install_system_fonts() {
    log_info "安装系统中文字体包..."

    if [[ "$OS_NAME" == *"Ubuntu"* ]] || [[ "$OS_NAME" == *"Debian"* ]]; then
        log_info "Ubuntu/Debian 系统，使用 apt 安装..."

        sudo apt update

        # 安装中文字体包
        sudo apt install -y \
            fonts-wqy-microhei \
            fonts-wqy-zenhei \
            fonts-noto-cjk \
            fonts-noto-cjk-extra \
            fonts-arphic-ukai \
            fonts-arphic-uming \
            fonts-droid-fallback \
            fontconfig \
            fonts-liberation \
            fonts-dejavu-core

        log_success "系统字体包安装完成"

    elif [[ "$OS_NAME" == *"CentOS"* ]] || [[ "$OS_NAME" == *"Red Hat"* ]] || [[ "$OS_NAME" == *"Rocky"* ]]; then
        log_info "CentOS/RHEL 系统，使用 yum/dnf 安装..."

        PKG_MANAGER="yum"
        if command -v dnf &> /dev/null; then
            PKG_MANAGER="dnf"
        fi

        # 安装 EPEL 仓库
        sudo $PKG_MANAGER install -y epel-release || true

        # 安装中文字体包
        sudo $PKG_MANAGER install -y \
            wqy-microhei-fonts \
            wqy-zenhei-fonts \
            google-noto-sans-cjk-fonts \
            fontconfig \
            liberation-fonts \
            dejavu-sans-fonts

        log_success "系统字体包安装完成"
    else
        log_warning "未识别的系统，跳过系统包安装"
    fi
}

# 手动下载安装字体
install_manual_fonts() {
    log_info "手动下载并安装中文字体..."

    # 创建字体目录
    FONT_DIR="/usr/share/fonts/chinese"
    sudo mkdir -p "$FONT_DIR"
    cd "$FONT_DIR"

    # 下载 Google Noto 字体
    if [ ! -f "NotoSansCJKsc-Regular.otf" ]; then
        log_info "下载 Google Noto Sans CJK SC..."
        if sudo wget -O "NotoSansCJKsc-Regular.otf" "https://github.com/googlefonts/noto-cjk/raw/main/Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Regular.otf" 2>/dev/null; then
            log_success "Noto Sans CJK SC 下载成功"
        else
            log_warning "Noto Sans CJK SC 下载失败"
        fi
    fi

    # 下载思源黑体
    if [ ! -f "SourceHanSansCN-Regular.otf" ]; then
        log_info "下载思源黑体..."
        if sudo wget -O "SourceHanSansCN-Regular.otf" "https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SimplifiedChinese/SourceHanSansCN-Regular.otf" 2>/dev/null; then
            log_success "思源黑体下载成功"
        else
            log_warning "思源黑体下载失败"
        fi
    fi

    # 设置权限
    sudo chmod 644 "$FONT_DIR"/*
    sudo chown root:root "$FONT_DIR"/*
}

# 更新字体缓存
update_font_cache() {
    log_info "更新字体缓存..."
    sudo fc-cache -fv
    log_success "字体缓存更新完成"
}

# 验证字体安装
verify_fonts() {
    log_info "验证字体安装结果..."

    CHINESE_FONTS_AFTER=$(fc-list :lang=zh 2>/dev/null | wc -l)
    log_info "安装后找到 $CHINESE_FONTS_AFTER 个中文字体"

    # 测试关键字体
    log_info "验证关键字体:"
    test_fonts=(
        "Noto Sans CJK SC"
        "Source Han Sans CN"
        "WenQuanYi Micro Hei"
        "WenQuanYi Zen Hei"
        "Droid Sans Fallback"
    )

    SUCCESS_COUNT=0
    for font in "${test_fonts[@]}"; do
        if fc-list | grep -qi "$font"; then
            log_success "✓ $font 可用"
            ((SUCCESS_COUNT++))
        else
            log_error "✗ $font 不可用"
        fi
    done

    if [ $SUCCESS_COUNT -gt 0 ]; then
        log_success "字体安装验证通过 ($SUCCESS_COUNT/${#test_fonts[@]} 个关键字体可用)"
        return 0
    else
        log_error "字体安装验证失败"
        return 1
    fi
}

# 创建字体测试页面
create_font_test() {
    log_info "创建字体测试页面..."

    cat > /tmp/font_test.html << 'EOF'
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>中文字体测试</title>
    <style>
        body { font-family: "Noto Sans CJK SC", "Source Han Sans CN", "WenQuanYi Micro Hei", sans-serif; }
        .test-text { font-size: 16px; margin: 10px 0; }
        h1 { color: #333; }
    </style>
</head>
<body>
    <h1>中文字体渲染测试</h1>
    <div class="test-text">这是一段中文测试文本，用于验证字体是否正确渲染。</div>
    <div class="test-text">常用汉字：你好世界，测试字体显示效果。</div>
    <div class="test-text">数字和英文：Hello World 123456789</div>
    <div class="test-text">特殊字符：《》、？！@#￥%……&*（）</div>
</body>
</html>
EOF

    log_success "字体测试页面已创建: /tmp/font_test.html"
    log_info "可以使用此文件测试PDF转换效果"
}

# 显示使用建议
show_recommendations() {
    echo ""
    echo "========================================"
    echo "使用建议和故障排除"
    echo "========================================"

    log_info "1. 重启应用程序以确保字体生效"
    log_info "2. 如果仍有乱码问题，请检查："
    echo "   - HTML文件是否使用UTF-8编码"
    echo "   - 是否正确设置了lang属性"
    echo "   - 浏览器是否能正确显示中文"

    log_info "3. 测试命令："
    echo "   python html_to_pdf.py /tmp/font_test.html /tmp/font_test.pdf"

    log_info "4. 调试信息："
    echo "   查看生成的 debug_page.png 截图"
    echo "   检查 html_to_pdf.log 日志文件"

    log_info "5. 如果问题持续存在，请提供："
    echo "   - 系统信息 (uname -a)"
    echo "   - 字体列表 (fc-list :lang=zh)"
    echo "   - 错误日志内容"
}

# 主函数
main() {
    detect_system
    echo ""

    check_existing_fonts
    echo ""

    read -p "是否继续安装/更新中文字体? (y/N): " -n 1 -r
    echo ""
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        install_system_fonts
        install_manual_fonts
        update_font_cache
        echo ""

        if verify_fonts; then
            create_font_test
            show_recommendations
            log_success "字体安装完成！现在可以重新测试PDF转换。"
        else
            log_error "字体安装可能有问题，请检查上述错误信息。"
        fi
    else
        log_info "跳过字体安装"
        show_recommendations
    fi
}

# 运行主函数
main
